package com.wmx.jmds.conntroller;

import com.wmx.jmds.service.JmdService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

/**
 * Springboot + JdbcTemplate + hikari 多数据源使用
 * 注入同一类型全部实现类的实例
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/2/23 17:24
 */
@RestController
public class JmdController {

    @Resource
    private JmdService jmdService;

    // 将 DataSource 接口所有实现类的实例注入到属性当中
    // 如果是 List 或者数组，则自动把实例对象全部放进去
    // 如果是 Map，则把实例的名称赋值作为 key，实例对象作为 value。
    // Resource 与 Autowired 接收方式相同
    @Resource
    private Map<String, DataSource> dataSourceMap;
    @Autowired
    private List<DataSource> dataSourceList;
    @Autowired
    private DataSource[] dataSources;

    // 当 Bean 初始化时执行 PostConstruct 标记的方法
    @PostConstruct
    public void init() {
        int i = 1;
        for (DataSource dataSource : dataSourceList) {
            // 1:HikariDataSource (null)
            // 2:HikariDataSource (null)
            // 3:HikariDataSource (null)
            System.out.println(i++ + ":" + dataSource);
        }
        int j = 1;
        for (Map.Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
            // 1：dataSource=HikariDataSource (null)
            // 2：workflowDataSource=HikariDataSource (null)
            // 3：elementDataSource=HikariDataSource (null)
            System.out.println(j++ + "：" + entry.getKey() + "=" + entry.getValue());
        }
        int k = 1;
        for (DataSource dataSource : dataSources) {
            // 1:HikariDataSource (null)
            // 2:HikariDataSource (null)
            // 3:HikariDataSource (null)
            System.out.println(k++ + ":" + dataSource);
        }
    }

    /**
     * 使用默认的数据源进行操作
     * http://localhost:8080/defaultDataSource
     */
    @GetMapping("defaultDataSource")
    public List<Map<String, Object>> defaultDataSource() {
        List<Map<String, Object>> mapList = jmdService.defaultDataSource();
        return mapList;
    }

    /**
     * 使用自定义的 workflow 数据源进行操作
     * http://localhost:8080/workflowDataSource
     *
     * @param
     */
    @GetMapping("workflowDataSource")
    public List<Map<String, Object>> workflowDataSource() {
        List<Map<String, Object>> mapList = jmdService.workflowDataSource();
        return mapList;
    }

    /**
     * 使用自定义的 workflow 数据源进行操作
     * http://localhost:8080/elementDataSource
     *
     * @param
     */
    @GetMapping("elementDataSource")
    public List<Map<String, Object>> elementDataSource() {
        List<Map<String, Object>> mapList = jmdService.elementDataSource();
        return mapList;
    }
}
